unit uFormPesquisaFiltro;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.DB, Vcl.Grids,
  Vcl.DBGrids, Vcl.Buttons, Vcl.ExtCtrls, uTipo, FireDAC.Stan.Intf,
  FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
  FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client, EuDBGrid;

type
  TformPesquisaFiltro = class(TForm)
    pnlOpcoes: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    edtConteudo: TEdit;
    btnPesquisa: TBitBtn;
    dtsPesquisa: TDataSource;
    cbxSelecao: TComboBox;
    grdPesquisa: TEuDBGrid;
    procedure btnPesquisaClick(Sender: TObject);
    procedure grdPesquisaDblClick(Sender: TObject);
    procedure edtConteudoKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
    Select, Field, Filtro, OrderBy: String;
    FPessoa, FProduto: Boolean;
  public
    { Public declarations }
  end;

  function PesquisarPessoaFiltro(var Dados: TPessoa; Const Filtro: String): Boolean;
  function PesquisarProdutoFiltro(var Dados: TProduto): Boolean;
//var
//  formPesquisaFiltro: TformPesquisaFiltro;

implementation

{$R *.dfm}

uses uDM;

function PesquisarPessoaFiltro(var Dados: TPessoa; Const Filtro: String): Boolean;
var
  F: TformPesquisaFiltro;
  Q: TFDQuery;
begin
  F := TformPesquisaFiltro.Create(nil);
  try
    F.Caption := 'Localizar pessoa';

    F.cbxSelecao.Items.Add('Todos');
    F.cbxSelecao.Items.Add('Cliente');
    F.cbxSelecao.Items.Add('Vendedor');
    F.cbxSelecao.Items.Add('Fornecedor');
    F.cbxSelecao.ItemIndex := 0;

    F.FPessoa := True;

    DM.cdsPesquisa.Close;
    F.Select := 'SELECT Id, Nome, NomeUsual, Contato, CNPJ_CPF FROM Pessoa ';
    F.Field := 'Nome';
    F.OrderBy := 'NomeUsual';
    Result := F.ShowModal = mrOk;
  finally
    if Result then
    begin
      Dados.Id := DM.cdsPesquisa.FieldByName('Id').AsInteger;
      Dados.Nome := DM.cdsPesquisa.FieldByName('Nome').AsString;
      Dados.NomeUsual := DM.cdsPesquisa.FieldByName('NomeUsual').AsString;
      Dados.CNPJ_CPF := DM.cdsPesquisa.FieldByName('CNPJ_CPF').AsString;
    end;
    FreeAndNil(F);
  end;
end;

function PesquisarProdutoFiltro(var Dados: TProduto): Boolean;
var
  F: TformPesquisaFiltro;
  Q: TFDQuery;
begin
  F := TformPesquisaFiltro.Create(nil);
  try
    F.Caption := 'Localizar produto';
    F.FProduto := True;

    F.cbxSelecao.Items.Add('Todos');
    Q := DM.CriarFDQuery;
    try
      Q.Open('SELECT Descricao FROM IndustriaMarca ORDER BY Descricao');
      while not Q.Eof do
      begin
        F.cbxSelecao.Items.Add(Q.Fields[0].AsString);
        Q.Next;
      end;
      F.cbxSelecao.ItemIndex := 0;
    finally
      FreeAndNil(Q);
    end;

    DM.cdsPesquisa.Close;
    F.Select := 'SELECT Produto.Id, Produto.Descricao FROM Produto ' +
    ' LEFT JOIN ProdutoIndustria ON ProdutoIndustria.Produto_Id = Produto.Id ' +
    ' LEFT JOIN IndustriaMarca ON IndustriaMarca.Id = ProdutoIndustria.IndustriaMarca_Id ';
    F.Filtro := '';
    F.Field := 'Produto.Descricao';
    F.OrderBy := 'Produto.Descricao';
    Result := F.ShowModal = mrOk;
  finally
    if Result then
    begin
      Dados.Id := DM.cdsPesquisa.FieldByName('Id').AsInteger;
      Dados.Codigo := DM.cdsPesquisa.FieldByName('Codigo').AsString;
      Dados.Descricao := DM.cdsPesquisa.FieldByName('Descricao').AsString;
    end;
    FreeAndNil(F);
  end;
end;

procedure TformPesquisaFiltro.btnPesquisaClick(Sender: TObject);
begin
  DM.cdsPesquisa.Close;

  if FPessoa then
  begin
    case cbxSelecao.ItemIndex of
      0: DM.cdsPesquisa.CommandText := Select + ' WHERE Id > 0 ';
      1: DM.cdsPesquisa.CommandText := Select + ' WHERE Cliente = "T" ';
      2: DM.cdsPesquisa.CommandText := Select + ' WHERE Vendedor = "T" ';
      3: DM.cdsPesquisa.CommandText := Select + ' WHERE Fornecedor = "T" ';
    end;
  end;
  if FProduto then
  begin
    if cbxSelecao.ItemIndex = 0 then
    begin
      DM.cdsPesquisa.CommandText := Select + ' WHERE Produto.Id > 0 ';
    end else
    begin
      DM.cdsPesquisa.CommandText := Select + ' WHERE IndustriaMarca.Descricao = '
        + QuotedStr(cbxSelecao.Items.Strings[cbxSelecao.ItemIndex]) + ' ';
    end;
  end;


  if Trim(edtConteudo.Text) <> '' then
    DM.cdsPesquisa.CommandText := DM.cdsPesquisa.CommandText + ' AND ' + Field + ' Like ' + QuotedStr('%'+edtConteudo.Text+'%');

  if OrderBy <> '' then
    DM.cdsPesquisa.CommandText := DM.cdsPesquisa.CommandText + ' ORDER BY ' + OrderBy;

  DM.cdsPesquisa.Open;
end;

procedure TformPesquisaFiltro.edtConteudoKeyPress(Sender: TObject;
  var Key: Char);
begin
  if Key = #13 then
    btnPesquisa.Click;
end;

procedure TformPesquisaFiltro.grdPesquisaDblClick(Sender: TObject);
begin
  if not DM.cdsPesquisa.IsEmpty then
    ModalResult := mrOk;
end;

end.
